﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;

namespace 多线程
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // 加入这行,禁止编译器对跨线程访问做检查。
            // .net框架不允许跨线程访问ui控件
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Thread th = new Thread(new ThreadStart(Test));

            //Thread th = new Thread(Test);
            //th.Start();

            Thread th = new Thread(new ParameterizedThreadStart(Test2));
            th.Start("yejing");

            //textBox1.Text = button1.Text;
            //listBox1.Items.Add(button1.Text);
        }

        public void Test()
        {
            for (int i = 0; i < 100; i++)
            {
                listBox1.Items.Add(i.ToString()); // 线程间操作无效: 从不是创建控件“listBox1”的线程访问它。”

            }
        }

        public void Test2(object name)
        {
            textBox1.Text = name.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            using (BackgroundWorker bw = new BackgroundWorker())
            {
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.RunWorkerAsync("Tank");
            }
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            // 这里是后台线程， 是在另一个线程上完成的
            // 这里是真正做事的工作线程
            // 可以在这里做一些费时的，复杂的操作
            Thread.Sleep(5000);
            e.Result = e.Argument + "工作线程完成";
            //listBox1 .Items.Add("工作线程完成"); // 线程间操作无效: 从不是创建控件“listBox1”的线程访问它。
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            listBox1.Items.Add((string)e.Result);
            //这时后台线程已经完成，并返回了主线程，所以可以直接使用UI控件了 
            for (int i = 0; i < 100; i++)
            {
                listBox1.Items.Add(i.ToString()); // 线程间操作无效: 从不是创建控件“listBox1”的线程访问它。”

            }
        }
    }
}
